Skip to content

test(core): 带 resize 时间线的回放工具(解阻 #194) - #265

Merged
JavaZeroo merged 2 commits into
mainfrom
feat/resize-replay
Oct 31, 2026
Merged

JavaZeroo merged 2 commits into
mainfrom
feat/resize-replay

Conversation

@JavaZeroo

@JavaZeroo JavaZeroo commented Oct 31, 2026 •

Copy link
Copy Markdown
Owner

问题与最终行为

#194 要核对「resize 期间的 ConPTY 重绘与终端视口/缓冲是否对齐」,但现有 replay 只能按固定几何回放整段捕获:

usage: replay input rows columns history chunk

跨 DPI / 缩放 / 窗口恢复的捕获(144 → 192 → 96 → zoom75 → restored)无法忠实回放,这也是在 #194 里只能做单块回放、无法检验跨 resize 假设的原因。

本 PR 新增 resize_replay:读取同一份字节流,按外部步骤文件依次应用几何。

resize_replay input steps-file history

# steps-file 每行:<rows> <columns> <bytes> [label]
7   111  1650  geometry-main
7   111  1071  geometry-bottom

每一步:Screen::resize() → 消费对应字节 → 输出该步状态:

{"step":1,"label":"geometry-main","rows":7,"columns":111,"consumed":1650,
 "total_consumed":1650,"history":30,"retained":37,"top":30,"maximum_top":30,
 "following":true,"cursor_row":6,"cursor_column":0}

最后一行输出整份 screen JSON(与 replay 相同格式)。

验证

  1. 与现有 replay 对拍:[R2][调查] 核对 resize 期间 ConPTY 重绘与终端视口/缓冲的对齐 #194 的 actions-geometry-main.transport.bin 在 7×111 下,
    两者都得到 retained=37 / history=30,新工具未改变回放语义。
  2. 合成用例:3 行视口喂 12 行 → resize 到 5 行 → 再喂 8 行,得到
    history 10→16、retained 分别等于 history + 当前页高(13 / 21),视口始终 following。
  3. 几何相关性回归([R2][调查] 核对 resize 期间 ConPTY 重绘与终端视口/缓冲的对齐 #194 的实测结论):同一份 20 行输入分别喂 4 / 10 / 24 行视口,
    断言 history 为 17 / 11 / 0,且 retained 始终等于 history + 页高。
    对应 [R2][调查] 核对 resize 期间 ConPTY 重绘与终端视口/缓冲的对齐 #194 在真实捕获上测到的「7 行页高推入 30 行历史、24 行页高推入 0 行」。
  4. test_resize_replay.py 四条用例,注册为 CTest resize_replay_contract,本机通过:
1/1 Test #29: resize_replay_contract ... Passed 0.25 sec

性能影响(如适用)

不适用。新增离线诊断工具,运行期路径不调用;工具本身只做一次流式 feed。

来源与限制

现有 replay 只能按固定几何回放整段捕获,因此跨 DPI/缩放/窗口恢复的捕获无法忠实回放——
#194 要核对的正是「resize 期间的重绘与视口/缓冲是否对齐」,缺的正是这个手段。

resize_replay 读取同一份字节流,但按外部步骤文件依次应用几何:

  <rows> <columns> <bytes> [label]

每一步先 Screen::resize(),再消费相应字节,并输出该步的 history/retained/top/
maximum_top/following/cursor。最后一行输出整份 screen JSON。

验证:
- 合成用例:3 行视口喂 12 行后 resize 到 5 行再喂 8 行,history 10→16、
  retained 分别等于 history + 当前页高
- 与现有 replay 对拍:本项 #194 的 geometry-main 块在 7x111 下,
  两者都得到 retained=37 / history=30
- 新增 test_resize_replay.py 三条用例并注册 CTest resize_replay_contract
#194 的机制实验显示:同一段重绘字节在 7 行页高下推入 30 行历史,在 24 行页高下推入 0 行。
本用例把这条性质固化为回归——同一份 20 行输入分别喂给 4/10/24 行视口,断言
history 为 17/11/0,且 retained 始终等于 history + 当前页高。

这样该性质不会因后续解析器改动被悄悄改变,也把 #194 的实测结论留在可执行的形式里。
@JavaZeroo
JavaZeroo merged commit 90a0272 into main Oct 31, 2026
11 of 12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant